package manage.modules;

import java.util.List;
import java.util.Map;

/**
 * 抽象服务类，用此类进行所有的单表操作都是非常方便的，但是要注意表的命名规则: 默认的取表名规则为去clazz的simplename,比如实体类名为CharSet,那么对应的表名就为CharSet
 * 还有一种稍微复杂点的：按类名大小写之间加"_"来分割，比如实体类名为CharSet,那么对应的表名就为Char_Set
 * 
 * @since 2012-08-01
 * @author dongji
 * 
 */
public interface AbstractDao {
	/**
	 * 查询clazz对应表中满足fields约束的记录(默认100条)
	 * 
	 * @param <T>
	 * @param fields
	 *            where 约束条件
	 * @param clazz
	 * @return
	 */
	<T> List<T> listByFields(Map<String, Object> fields, Class<T> clazz);

	/**
	 * 查询rowSize条clazz对应表中满足fields约束的记录
	 * 
	 * @param <T>
	 * @param fields
	 *            where 约束条件
	 * @param clazz
	 * @param rowIndex
	 * @param rowSize
	 * @return
	 */
	<T> List<T> listByFields(Map<String, Object> fields, Class<T> clazz, int rowIndex, int rowSize);

	/**
	 * 查询clazz对应表中满足field=value约束的记录(默认100条)
	 * 
	 * @param <T>
	 * @param field
	 * @param value
	 * @param clazz
	 * @return
	 */
	<T> List<T> listByField(String field, Object value, Class<T> clazz);

	/**
	 * 查询rowSiz条clazz对应表中满足field=value约束的记录
	 * 
	 * @param <T>
	 * @param field
	 * @param value
	 * @param clazz
	 * @param rowIndex
	 * @param rowSize
	 * @return
	 */
	<T> List<T> listByField(String field, Object value, Class<T> clazz, int rowIndex, int rowSize);

	/**
	 * 查询clazz对应表中满足field like %value%的数据(默认100条)
	 * 
	 * @param <T>
	 * @param field
	 * @param value
	 * @param clazz
	 * @return
	 */
	<T> List<T> listByFieldLike(String field, Object value, Class<T> clazz);

	/**
	 * 查询rowSiz条clazz对应表中满足field like %value%的数据
	 * 
	 * @param <T>
	 * @param field
	 * @param value
	 * @param clazz
	 * @param rowIndex
	 * @param rowSize
	 * @return
	 */
	<T> List<T> listByFieldLike(String field, Object value, Class<T> clazz, int rowIndex,
			int rowSize);

	/**
	 * 随机查询clazz对应表中rowSize条field=value的数据
	 * 
	 * @param <T>
	 * @param field
	 * @param value
	 * @param clazz
	 * @param rowSize
	 * @return
	 */
	<T> List<T> listByFieldRandom(String field, Object value, Class<T> clazz, int rowSize);

	/**
	 * 查询全表
	 * 
	 * @param <T>
	 * @param clazz
	 *            对应的类
	 * @return
	 */
	<T> List<T> listAll(Class<T> clazz);

	/**
	 * 查询符合fidld=value对应的记录
	 * 
	 * @param <T>
	 * @param field
	 *            键名
	 * @param value
	 *            键值
	 * @param clazz
	 *            对应的类
	 * @return
	 */
	<T> T select(String field, Object value, Class<T> clazz);

	/**
	 * 查询符合fields键值对对应的记录
	 * 
	 * @param <T>
	 * @param conditions
	 *            约束条件
	 * @param clazz
	 *            对应的类
	 * @return
	 */
	<T> T select(Map<String, Object> conditions, Class<T> clazz);

	/**
	 * 插入一条记录返回影响的行数
	 * 
	 * @param <T>
	 * @param entity
	 *            要写入的实体
	 * @return 影响的行数
	 */
	<T> int insert(T entity);

	/**
	 * 插入一条记录返回生成的ID
	 * 
	 * @param <T>
	 * @param entity
	 *            要写入的实体
	 * @return 生成的ID
	 */
	<T> long insertFetchId(T entity);

	/**
	 * 替换对应的对象语句
	 * 
	 * @param <T>
	 * @param entity
	 * @return
	 */
	<T> int replace(T entity);

	/**
	 * 更新field=value对应的记录
	 * 
	 * @param <T>
	 * @param field
	 *            键名
	 * @param value
	 *            键值
	 * @param clazz
	 *            对应的类
	 * @return
	 */
	<T> int updateFields(String field, Object value, T entity);

	/**
	 * 更新符合fields键值对对应的记录(conditions不会更新)
	 * 
	 * @param <T>
	 * @param fields
	 *            要更新的字段
	 * @param conditions
	 *            conditions更新约束条件
	 * @param clazz
	 * @return
	 */
	<T> int updateFields(Map<String, Object> fields, Map<String, Object> conditions, Class<T> clazz);

	/**
	 * 删除field=value对应的记录
	 * 
	 * @param <T>
	 * @param field
	 *            键名
	 * @param value
	 *            键值
	 * @param clazz
	 *            对应的类
	 * @return
	 */
	<T> int delete(String field, Object value, Class<T> clazz);

	/**
	 * 删除符合fields键值对的记录(2^31-1条)
	 * 
	 * @param <T>
	 * @param fields
	 * @param clazz
	 * @return
	 */
	<T> int deleteByFields(Map<String, Object> fields, Class<T> clazz);

	/**
	 * 删除rowSize条符合fields键值对的记录
	 * 
	 * @param <T>
	 * @param fields
	 * @param clazz
	 * @param rowSize
	 * @return
	 */
	<T> int deleteByFields(Map<String, Object> fields, Class<T> clazz, int rowSize);

	/**
	 * 检field=value对应的记录是否存在
	 * 
	 * @param <T>
	 * @param field
	 *            键名
	 * @param value
	 *            键值
	 * @param clazz
	 *            对应的类
	 * @return 存在返回true,反之返回false
	 */
	<T> boolean exists(String field, Object value, Class<T> clazz);

	/**
	 * 检查满足fields对应的记录是否存在
	 * 
	 * @param <T>
	 * @param fields
	 *            约束键值对
	 * @param clazz
	 *            对应的类
	 * @return 存在返回true,反之返回false
	 */
	<T> boolean exists(Map<String, Object> fields, Class<T> clazz);

	/**
	 * 得到对应的全表的count语句
	 * 
	 * @param <T>
	 * @param clazz
	 * @return
	 */
	<T> Long countOfAll(Class<T> clazz);

	/**
	 * 得到符合field=value的count（1）值
	 * 
	 * @param <T>
	 * @param field
	 * @param value
	 * @param clazz
	 * @return
	 */
	<T> Long countByField(String field, String value, Class<T> clazz);

	/**
	 * 得到符合fields键值对的count（1）值
	 * 
	 * @param <T>
	 * @param fields
	 * @param clazz
	 * @return
	 */
	<T> Long countByFields(Map<String, Object> fields, Class<T> clazz);

}
